package org.jsola.hr.service;

import org.jsola.core.Page;
import org.jsola.core.service.IService;
import org.jsola.hr.dao.IEmpSocMonthDAO;
import org.jsola.hr.dto.EmpSocMonthAddDTO;
import org.jsola.hr.dto.EmpSocMonthUpdateDTO;
import org.jsola.hr.entity.EmpSocMonthDO;
import org.jsola.hr.query.EmpSocMonthQuery;
import org.jsola.hr.query.SocCheckCustomQuery;
import org.jsola.hr.vo.EmpSocMonthListVO;
import org.jsola.hr.vo.EmpSocMonthVO;
import org.jsola.hr.vo.MonthNextAndPreviousCheckVO;
import org.jsola.hr.vo.YearAndMonthVO;
import org.jsola.user.core.TokenUser;

import java.util.Date;
import java.util.List;
import java.util.Map;


/**
 * 员工参保信息月统计
 *
 * @author zhr
 */
public interface IEmpSocMonthService extends IService<IEmpSocMonthDAO, EmpSocMonthDO> {

    /**
     * 新增员工参保信息月统计
     *
     * @param empSocMonthAddDTO 新增员工参保信息月统计DTO
     * @param tokenUser         当前用户
     * @return 员工参保信息月统计详情信息
     */
    EmpSocMonthVO save(EmpSocMonthAddDTO empSocMonthAddDTO, TokenUser tokenUser);

    /**
     * 新增员工参保信息月统计
     *
     * @param empSocMonthAddDTO 新增员工参保信息月统计DTO
     * @param tokenUser         当前用户
     * @return 员工参保信息月统计详情信息
     */
    EmpSocMonthVO initSave(EmpSocMonthAddDTO empSocMonthAddDTO, TokenUser tokenUser);

    /**
     * 修改员工参保信息月统计
     *
     * @param empSocMonthUpdateDTO 修改员工参保信息月统计DTO
     * @param tokenUser            当前用户
     * @return 更新数量
     */
    int update(EmpSocMonthUpdateDTO empSocMonthUpdateDTO, TokenUser tokenUser);


    /**
     * 批量删除员工参保信息月统计，物理删除，更新is_valid字段，从回收站删除
     *
     * @param tokenUser      当前用户
     * @param empSocMonthIds 员工参保信息月统计id
     * @return 删除数量
     */
    int deleteByIds(TokenUser tokenUser, String... empSocMonthIds);

    /**
     * 删除参保月
     *
     * @param companyId 公司Id
     * @param year      年
     * @param month     月
     * @param tokenUser 当前用户
     * @return 删除数量
     */
    int deleteByCompanyIdAndYearMonth(String companyId, String year, String month, TokenUser tokenUser);

    /**
     * 根据员工参保信息月统计id查找
     *
     * @param empSocMonthId 员工参保信息月统计id
     * @param siteId        所属站点id
     * @return 员工参保信息月统计详情信息
     */
    EmpSocMonthVO selectById(String empSocMonthId, String siteId);

    /**
     * 查询员工参保信息月统计
     *
     * @param empSocMonthQuery 查询条件
     * @param siteId           所属站点id
     * @return 员工参保信息月统计列表信息
     */
    List<EmpSocMonthListVO> select(EmpSocMonthQuery empSocMonthQuery, String siteId);

    /**
     * 查询员工参保信息月统计记录数
     *
     * @param empSocMonthQuery 查询条件
     * @param siteId           所属站点id
     * @return 员工参保信息月统计记录数
     */
    int selectCount(EmpSocMonthQuery empSocMonthQuery, String siteId);

    /**
     * 分页查询员工参保信息月统计
     *
     * @param empSocMonthQuery 查询条件
     * @param siteId           所属站点id
     * @return 员工参保信息月统计列表信息
     */
    Page<EmpSocMonthListVO> selectPage(EmpSocMonthQuery empSocMonthQuery, String siteId);


    /**
     * 根据员工参保信息月统计id查找
     *
     * @param empSocMonthId 员工参保信息月统计id
     * @param siteId        所属站点id
     * @return 员工参保信息月统计
     */
    EmpSocMonthDO selectDOById(String empSocMonthId, String siteId);

    /**
     * 查询员工参保信息月统计
     *
     * @param empSocMonthQuery 查询条件
     * @param siteId           所属站点id
     * @return 员工参保信息月统计列表
     */
    List<EmpSocMonthDO> selectDO(EmpSocMonthQuery empSocMonthQuery, String siteId);

    /**
     * 某公司已生成参保记录的年月
     *
     * @param companyId 公司id
     * @param siteId    站点id
     * @return 某公司已生成参保记录的年月
     */
    List<YearAndMonthVO> listYearAndMonthByCompany(String companyId, String siteId);

    /**
     * 校验某公司某年月是否有参保记录
     *
     * @param companyId 公司id
     * @param year      年
     * @param month     月
     * @param siteId    站点id
     * @return 是否有参保记录
     */
    boolean existsByYearAndMonth(String companyId, String year, String month, String siteId);

    /**
     * 校验某公司某年月是否有参保记录,没有返回空串,有返回这个月的month的id
     *
     * @param companyId 公司id
     * @param date      时间
     * @param siteId    站点id
     * @return 参保月份MonthId
     */
    String selectMonthIdByCurrentDate(String companyId, Date date, String siteId);

    /**
     * 根据年月查询参保月的MonthId,没有会返回空串
     *
     * @param companyId 公司Id
     * @param year      年
     * @param month     月
     * @param siteId    站点Id
     * @return 参保月份MonthId
     */
    String selectMonthIdByYearAndMonth(String companyId, String year, String month, String siteId);

    /**
     * 查询用工单位下对应月份的参保月
     *
     * @param companyIdList 用工单位列表
     * @param year          年
     * @param month         月
     * @param siteId        站点
     * @return 参保月
     */
    List<EmpSocMonthDO> selectByYearAndMonth(List<String> companyIdList, String year, String month, String siteId);

    /**
     * 根据年月查询参保月,没有会返回空串
     *
     * @param companyId 公司Id
     * @param year      年
     * @param month     月
     * @param siteId    站点Id
     * @return 参保月
     */
    EmpSocMonthDO selectMonthByYearAndMonth(String companyId, String year, String month, String siteId);

    /**
     * 根据年月查询多用工单位参保月的MonthId,没有会返回空List
     *
     * @param companyIdList 公司Id列表
     * @param year          年
     * @param month         月
     * @param siteId        站点Id
     * @return 参保月份MonthId
     */
    List<String> selectMonthIdByYearAndMonthCompanyIdList(List<String> companyIdList, String year, String month, String siteId);

    /**
     * 查询
     *
     * @param companyId 公司Id
     * @param siteId    站点
     * @return 时间列表
     */
    Map<String, Date> selectMonthIdGreatThanYearAndMonth(String companyId, String siteId);

    /**
     * 根据Date查询参保月的MonthId,没有会返回空串
     *
     * @param companyId 公司Id
     * @param date      时间
     * @param siteId    站点Id
     * @return 参保月份MonthId
     */
    String selectMonthIdByDate(String companyId, Date date, String siteId);

    /**
     * 根据Date查询参保月的MonthId,没有会返回空串跨站点
     *
     * @param date 时间
     * @return 参保月份MonthId
     */
    List<String> selectMonthIdByDateNotSite(Date date);

    /**
     * 查询某个时间或某个时间段的MonthId
     *
     * @param startYear    开始年
     * @param startMonth   开始月
     * @param endYear      结束年
     * @param endMonth     结束月
     * @param companyId    公司Id
     * @param isAcrossYear 是否跨年
     * @param siteId       站点
     * @return monthId列表
     */
    List<String> selectMonthIdForWhile(String startYear, String startMonth, String endYear,
                                       String endMonth, String companyId, Boolean isAcrossYear, String siteId);

    /**
     * 查询某年的所有MonthId
     *
     * @param year      年
     * @param companyId 公司Id
     * @param siteId    站点Id
     * @return monthId列表
     */
    List<String> selectOneYearMonthId(String year, String companyId, String siteId);

    /**
     * 保存方法,传进来一个Date
     *
     * @param companyId 公司id
     * @param date      时间
     * @param tokenUser 当前用户
     * @return 是否有参保记录
     */
    EmpSocMonthVO saveByDate(String companyId, Date date, TokenUser tokenUser);

    /**
     * 保存方法,传进来年和月的字符串
     *
     * @param companyId 公司Id
     * @param year      年
     * @param month     月
     * @param tokenUser 当前用户
     * @return 员工参保信息月统计详情信息
     */
    EmpSocMonthVO saveByYearAndMonth(String companyId, String year, String month, TokenUser tokenUser);

    /**
     * 查询站点下某月创建的参保月
     *
     * @param year          年
     * @param month         月
     * @param companyIdList 公司Id列表
     * @param tokenUser     当前用户
     * @return 参保月
     */
    List<EmpSocMonthDO> selectHomeMonthId(String year, String month, List<String> companyIdList, TokenUser tokenUser);

    /**
     * 检测传入月份的前一个和后一个参保月创建与否
     *
     * @param year      年
     * @param month     月
     * @param companyId 公司Id
     * @param siteId    站点
     * @return 传入月份的前一个和后一个参保月创建与否
     */
    MonthNextAndPreviousCheckVO checkMonthNextAndPrevious(String year, String month, String companyId, String siteId);

    /**
     * 查询传入月以及他之后的MonthId
     *
     * @param startDate 开始时间
     * @param endDate   结束时间
     * @param companyId 公司id
     * @param siteId    站点
     * @return monthId列表
     */
    List<String> selectCurrentDateAfterMonthId(String startDate, String endDate, String companyId, String siteId);

    /**
     * 查询当前公司创建的最后一个参保月,删除的也算
     *
     * @param companyId 公司Id
     * @param siteId    站点
     * @return 参保月
     */
    EmpSocMonthDO checkLastMonth(String companyId, String siteId);

    /**
     * 查询当前公司创建的最后一个参保月
     *
     * @param companyId 公司Id
     * @param siteId    站点
     * @return 参保月
     */
    EmpSocMonthDO checkLastMonthValid(String companyId, String siteId);

    /**
     * 查询公司下的所有参保月(社保校验页面)
     *
     * @param socCheckCustomQuery 查询参数
     * @param tokenUser           当前用户
     * @return 参保月
     */
    List<EmpSocMonthListVO> listAllByCompanyId(SocCheckCustomQuery socCheckCustomQuery, TokenUser tokenUser);

    /**
     * 根据Id列表查询参保月
     *
     * @param monthIdList 参保月Id列表
     * @return 参保月列表
     */
    List<EmpSocMonthDO> selectByMonthIdList(List<String> monthIdList);


    /**
     * 根据时间字符串查询参保月
     *
     * @param companyId 公司Id
     * @param dateStr   时间字符串
     * @param siteId    站点
     * @return 参保月列表
     */
    List<String> selectMonthIdListAfterAndEqualsDate(String companyId, String dateStr, String siteId);

    /**
     * 根据字符串查询参保月
     *
     * @param companyId 公司Id
     * @param dateStr   字符串
     * @param siteId    站点
     * @return 参保月
     */
    List<EmpSocMonthListVO> selectByMonthByDateStrList(String companyId, List<String> dateStr, String siteId);
}


